/*
 * Copyright (C) 2022 panpf <panpfpanpf@outlook.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.github.panpf.sketch.stateimage

import android.graphics.drawable.Drawable
import com.github.panpf.sketch.Sketch
import com.github.panpf.sketch.request.ImageRequest
import com.github.panpf.sketch.target.ViewDisplayTarget
import com.github.panpf.sketch.util.asOrNull

/**
 * Use current [Drawable] as the state [Drawable]
 */
class CurrentStateImage(
    private val defaultImage: StateImage? = null
) : StateImage {

    constructor(defaultDrawable: Drawable) : this(DrawableStateImage(defaultDrawable))

    constructor(defaultDrawableRes: Int) : this(DrawableStateImage(defaultDrawableRes))

    override fun getDrawable(
        sketch: Sketch,
        request: ImageRequest,
        throwable: Throwable?
    ): Drawable? =
        request.target.asOrNull<ViewDisplayTarget<*>>()?.drawable
            ?: defaultImage?.getDrawable(sketch, request, throwable)

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        other as CurrentStateImage
        if (defaultImage != other.defaultImage) return false
        return true
    }

    override fun hashCode(): Int {
        return defaultImage?.hashCode() ?: 0
    }

    override fun toString(): String {
        return "CurrentStateImage($defaultImage)"
    }
}